home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
progtool
/
modula2
/
module
/
cookieja.mod
< prev
next >
Wrap
Text File
|
1995-11-25
|
7KB
|
219 lines
IMPLEMENTATION MODULE CookieJar;
FROM SYSTEM IMPORT ADDRESS,VAL,TSIZE;
FROM MACHINE IMPORT SuperOn,SuperOff;
FROM InOut IMPORT WriteString,WriteLn;
FROM LongInOut IMPORT WriteLongCard;
(*TYPE Cookie = RECORD
CookieId : ARRAY [0..3] OF CHAR;
CookieValue : LONGCARD;
END(*RECORD*);*)
PROCEDURE CreateCookie(VAR cookie:Cookie; id : ARRAY OF CHAR;
value: LONGCARD );
(* Initialisiert in der Variablen cookie einen Cookie;
als weitere Parameter werden die Id des Coockies sowie
dessen Wert übergeben *)
BEGIN
cookie.CookieId[0]:=id[0];
cookie.CookieId[1]:=id[1];
cookie.CookieId[2]:=id[2];
cookie.CookieId[3]:=id[3];
cookie.CookieValue:=value;
END CreateCookie;
PROCEDURE ccmp(c1,c2:Cookie):BOOLEAN;
(* Nur um nicht StrCompare IMPORTieren zu müssen*)
BEGIN
IF (c1.CookieId[0]=c2.CookieId[0]) AND
(c1.CookieId[1]=c2.CookieId[1]) AND
(c1.CookieId[2]=c2.CookieId[2]) AND
(c1.CookieId[3]=c2.CookieId[3]) THEN
RETURN TRUE
ELSE
RETURN FALSE
END(*IF*);
END ccmp;
PROCEDURE NewCookie(VAR Entry:Cookie):BOOLEAN;
(* Trägt einen Neuen Cookie in den Jar ein.
Achtung !
Der Fall eines bereits vollen Jars wird hier nicht
abgefangen. Es muss dann entsprechend Speicher ALLOCATEed
und der ganze Jar umkopiert werden *)
TYPE CookieJar = POINTER TO Cookie;
VAR cookieJar, cookieJar1 : CookieJar;
cookiePtr : POINTER TO CookieJar;
cookieAdr :ADDRESS;
actRow : LONGCARD;
BEGIN
SuperOn;
cookiePtr:=VAL(ADDRESS,05A0H);
cookieJar:=cookiePtr^;
SuperOff;
actRow:=0D;
IF cookieJar # NIL THEN
cookieAdr:=cookieJar;
WHILE cookieJar^.CookieId[0]#0C DO
INC(actRow);
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar:=cookieAdr;
END(*WHILE*);
IF actRow<cookieJar^.CookieValue THEN
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar1:=cookieAdr;
cookieJar1^:=cookieJar^;
cookieJar^:=Entry;
END(*IF*);
END(*IF*);
RETURN FALSE
END NewCookie;
PROCEDURE GetCookie(VAR cookie:Cookie):BOOLEAN;
(* fragt den Wert eines Cookies ab.
Als Parameter wird dabei die ID des zu suchenden Cookies
übergeben.
die Routine liefert FALSE wenn der Cookie nicht
gefunden wurde; wenn er gefunden wurde
wird TRUE zurückgegeben und der Wert des Cookies
in cookie.CookieValue eingetragen *)
TYPE CookieJar = POINTER TO Cookie;
VAR cookieJar : CookieJar;
cookiePtr : POINTER TO CookieJar;
cookieAdr :ADDRESS;
BEGIN
SuperOn;
cookiePtr:=VAL(ADDRESS,05A0H);
cookieJar:=cookiePtr^;
SuperOff;
IF cookieJar # NIL THEN
cookieAdr:=cookieJar;
WHILE ~ccmp(cookieJar^,cookie)
AND ( cookieJar^.CookieId[0]#0C) DO
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar:=cookieAdr;
END(*WHILE*);
IF cookieJar^.CookieId[0]#0C THEN
cookie:=cookieJar^; RETURN TRUE
END(*IF*);
END(*IF*);
RETURN FALSE
END GetCookie;
PROCEDURE RemoveCookie(VAR id : ARRAY OF CHAR);
(* entfernt den mit id bezeichneten Cookie aus dem CookieJar*)
TYPE CookieJar = POINTER TO Cookie;
VAR cookieJar,
cookieJar1 : CookieJar;
cookiePtr : POINTER TO CookieJar;
cookieAdr :ADDRESS;
cookie : Cookie;
BEGIN
CreateCookie(cookie,id,0D);
SuperOn;
cookiePtr:=VAL(ADDRESS,05A0H);
cookieJar:=cookiePtr^;
SuperOff;
IF cookieJar # NIL THEN
cookieAdr:=cookieJar;
WHILE ~ccmp(cookieJar^,cookie)
AND (cookieJar^.CookieId[0]#0C) DO
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar:=cookieAdr;
END(*WHILE*);
WHILE cookieJar^.CookieId[0]#0C DO
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar1:=cookieAdr;
cookieJar^:=cookieJar1^;
cookieJar:=cookieAdr;
END(*WHILE*);
END(*IF*);
END RemoveCookie;
PROCEDURE MoveCookieJar(Destination : ADDRESS; size :LONGCARD);
(* verschiebt Kompletten CookieJar an eine neue Speicherstelle.
Als Parameter werden die neue ADDRESSe des Jars sowie seine Grösse
d.h. die Anzahl der in ihn hineinpassenden Cookies übergeben *)
TYPE CookieJar = POINTER TO Cookie;
VAR cookieJar,
NewCookieJar : CookieJar;
cookiePtr(*,NewCookiePtr*) : POINTER TO CookieJar;
cookieAdr,NewCookieAdr :ADDRESS;
BEGIN
SuperOn;
cookiePtr:=VAL(ADDRESS,05A0H);
cookieJar:=cookiePtr^;
SuperOff;
NewCookieJar:=Destination;
IF cookieJar # NIL THEN
cookieAdr:=cookieJar;
WHILE cookieJar^.CookieId[0]#0C DO
NewCookieJar^:=cookieJar^;
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar:=cookieAdr;
NewCookieAdr:=NewCookieAdr+VAL(ADDRESS,TSIZE(Cookie));
NewCookieJar:=NewCookieAdr;
END(*WHILE*);
NewCookieJar^.CookieId:=cookieJar^.CookieId;
NewCookieJar^.CookieValue:=size;
SuperOn;
cookiePtr:=VAL(ADDRESS,05A0H);
cookiePtr:=Destination;
SuperOff;
END(*IF*);
END MoveCookieJar;
PROCEDURE CookieSize():LONGCARD;
TYPE CookieJar = POINTER TO Cookie;
VAR cookieJar : CookieJar;
cookiePtr : POINTER TO CookieJar;
cookieAdr :ADDRESS;
BEGIN
SuperOn;
cookiePtr:=VAL(ADDRESS,05A0H);
cookieJar:=cookiePtr^;
SuperOff;
IF cookieJar # NIL THEN
cookieAdr:=cookieJar;
WHILE cookieJar^.CookieId[0]#0C DO
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar:=cookieAdr;
END(*WHILE*);
RETURN (cookieJar^.CookieValue);
END(*IF*);
RETURN 0D;
END CookieSize;
PROCEDURE PrintCookieJar;
TYPE CookieJar = POINTER TO Cookie;
VAR cookieJar : CookieJar;
cookiePtr : POINTER TO CookieJar;
cookieAdr :ADDRESS;
BEGIN
SuperOn;
(* Zeiger auf CookieJar holen *)
cookiePtr:=VAL(ADDRESS,05A0H);
cookieJar:=cookiePtr^;
SuperOff;
(* Ist der CookieJar überhaupt vorhanden? *)
IF cookieJar # NIL THEN
cookieAdr:=cookieJar;
WHILE cookieJar^.CookieId[0]#0C DO
WriteString(cookieJar^.CookieId);
WriteLongCard(cookieJar^.CookieValue,10);
WriteLn;
cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
cookieJar:=cookieAdr;
END(*WHILE*);
WriteString('Größe');
WriteLongCard(cookieJar^.CookieValue,10);
END(*IF*);
END PrintCookieJar;
END CookieJar.